//import java.io.FileWriter;
//import java.io.IOException;
//import java.util.*;
//
//public class Maerchen {
//
//    public static ArrayList<Lebkuchenflaeche> flaechen = new ArrayList<>();
//
//    /**
//     * Mainmethode des Programms
//     * Baut Schritt für Schritt ein Lebkuchenhaus auf
//     *
//     * @param args - nicht verwendet
//     */
//    public static void main(String[] args) {
//
//        flaechenInitialisieren();
//
//        int gesamtAnzahlBausteine = 0;
//        int gesamtHerstellungszeit = 0;
//
//        for (int i = 0; i < flaechen.size(); i++) {
//            gesamtAnzahlBausteine += flaecheFuellen(i);
//            gesamtHerstellungszeit += glasurOptimieren(i);
//        }
//
//        speichereAusgabeInDatei("loesung.txt", gesamtAnzahlBausteine, gesamtHerstellungszeit);
//    }
//
//    /**
//     * Initialisiert die Elemente von flaeche, die das gesamte Haus repräsentieren
//     */
//    public static void flaechenInitialisieren() {
//        /*
//         * Fügen Sie hier Ihren Code ein
//         */
//        flaechen.add(new Lebkuchenflaeche(new Lebkuchen[20][30], Lebkuchenflaeche.Position.BODEN));
//        flaechen.add(new Lebkuchenflaeche(new Lebkuchen[20][30], Lebkuchenflaeche.Position.VORDERSEITE));
//        flaechen.add(new Lebkuchenflaeche(new Lebkuchen[30][30], Lebkuchenflaeche.Position.RUECKSEITE));
////        for (int i =9; i >=0; i--) {
////            flaechen.add(new Lebkuchenflaeche(new Lebkuchen[1][20 - 2 * i], Lebkuchenflaeche.Position.SEITENWAND1));
////        }
//        flaechen.add(new Lebkuchenflaeche(new Lebkuchen[30][20], Lebkuchenflaeche.Position.SEITENWAND1));
//
////        for (int i =9; i >=0; i--) {
////            flaechen.add(new Lebkuchenflaeche(new Lebkuchen[1][20 - 2 * i], Lebkuchenflaeche.Position.SEITENWAND2));
////        }
//        flaechen.add(new Lebkuchenflaeche(new Lebkuchen[30][20], Lebkuchenflaeche.Position.SEITENWAND2));
//
//        flaechen.add(new Lebkuchenflaeche(new Lebkuchen[23][30], Lebkuchenflaeche.Position.DACHSCHRAEGE));
//
//    }
//
//    /**
//     * Füllt eine Lebkuchenflaeche mit möglichst wenigen Lebkuchenbausteinen
//     *
//     * @param index Index der zu bearbeitenden Lebkuchenflaeche in der Liste flaechen
//     * @return die Anzahl der Bausteine, mit denen die Flaeche gefüllt wurde
//     */
//    public static int flaecheFuellen(int index) {
//        /*
//         * Fügen Sie hier Ihren Code ein
//         */
//        Lebkuchenflaeche lebkuchenflaeche = flaechen.get(index);
//        Lebkuchen[][] lebkuchens = lebkuchenflaeche.getArray();
//        int count = 0;
//        if (index == 0 || index==1) {
//            for (int x = 0; x < 20; x += 2) {
//                for (int y = 0; y < 30; y += 3) {
//                    Lebkuchen lebkuchen = new Lebkuchen(3, 2, null);
//                    lebkuchens[x][y] = lebkuchen;
//                    lebkuchens[x][y + 1] = lebkuchen;
//                    lebkuchens[x][y + 2] = lebkuchen;
//                    lebkuchens[x + 1][y] = lebkuchen;
//                    lebkuchens[x + 1][y + 1] = lebkuchen;
//                    lebkuchens[x + 1][y + 2] = lebkuchen;
//                    count++;
//                }
//            }
//        } else if (index == 2) {
//            for (int x = 0; x < 30; x += 2) {
//                for (int y = 0; y < 30; y += 3) {
//                    Lebkuchen lebkuchen = new Lebkuchen(3, 2, null);
//                    lebkuchens[x][y] = lebkuchen;
//                    lebkuchens[x][y + 1] = lebkuchen;
//                    lebkuchens[x][y + 2] = lebkuchen;
//                    lebkuchens[x + 1][y] = lebkuchen;
//                    lebkuchens[x + 1][y + 1] = lebkuchen;
//                    lebkuchens[x + 1][y + 2] = lebkuchen;
//                    count++;
//                }
//            }
//        } else if (index == 3 || index == 4) {
//            for (int x = 0; x < 20; x += 2) {
//                for (int y = 0; y < 20; y += 3) {
//                    Lebkuchen lebkuchen = new Lebkuchen(3, 2, null);
//                    lebkuchens[x][y] = lebkuchen;
//                    lebkuchens[x][y + 1] = lebkuchen;
//                    lebkuchens[x][y + 2] = lebkuchen;
//                    lebkuchens[x + 1][y] = lebkuchen;
//                    lebkuchens[x + 1][y + 1] = lebkuchen;
//                    lebkuchens[x + 1][y + 2] = lebkuchen;
//                    count++;
//                }
//            }
//            for (int x = 0; x < 20; x +=2) {
//                Lebkuchen lebkuchen = new Lebkuchen(2, 2, null);
//                lebkuchens[x][18] = lebkuchen;
//                lebkuchens[x][19] = lebkuchen;
//                lebkuchens[x+1][19] = lebkuchen;
//                lebkuchens[x+1][19] = lebkuchen;
//                count++;
//            }
//            for (int x = 21; x < 30; x+=2) {
//                for (int y = 0; y < 20-2*(x-21); y++) {
//
//                }
//
//            }
//        }
//    }
//
//    /**
//     * Setzt die Glasur eines Lebkuchenbausteins, idealerweise so,
//     * dass die Glasur anders ist als die aller benachbarten Bausteine
//     *
//     * @param index    Index der zu bearbeitenden Lebkuchenflaeche in der Liste flaechen
//     * @param baustein Lebkuchenbaustein, der glasiert werden soll
//     * @param startY   y-Koordinate der linken untere Ecke des zu glasierenden Bausteins
//     * @param startX   x-Koordinate der linken untere Ecke des zu glasierenden Bausteins
//     */
//    public static void bausteinGlasieren(int index, Lebkuchen baustein, int startY, int startX) {
//        /*
//         * Fügen Sie hier Ihren Code ein
//         */
//        Lebkuchenflaeche lebkuchenflaeche = flaechen.get(index);
//        Lebkuchen[][] lebkuchens = lebkuchenflaeche.getArray();
//        List<String> allSymbols = new ArrayList<>();
//        allSymbols.add("*");
//        allSymbols.add("/");
//        allSymbols.add("+");
//
//        //left
//        for (int i = startX - 1; i >= 0; i--) {
//            Lebkuchen lebkuchenTmp = lebkuchens[startY][i];
//            if (!baustein.equals(lebkuchenTmp)) {
//                allSymbols.remove(lebkuchenTmp.getGlasur().toString());
//                break;
//            }
//        }
//        // bottom
//        for (int i = startY - 1; i >= 0; i--) {
//            Lebkuchen lebkuchenTmp = lebkuchens[i][startX];
//            if (!baustein.equals(lebkuchenTmp)) {
//                allSymbols.remove(lebkuchenTmp.getGlasur().toString());
//                break;
//            }
//        }
//        Random random = new Random();
//        String symbol = allSymbols.get(random.nextInt(allSymbols.size()));
//        if (symbol.equals("*")) {
//            baustein.setGlasur(new Sternchenmuster());
//        } else if (symbol.equals("+")) {
//            baustein.setGlasur(new Kreuzmuster());
//        } else {
//            baustein.setGlasur(new Strichmuster());
//        }
//    }
//
//    /**
//     * Berechnet die Gesamtherstellungszeit einer Lebkuchenflaeche
//     *
//     * @param index Index der zu verwendenden Lebkuchenflaeche in der Liste flaechen
//     * @return gesamte Herstellungszeit der Lebkuchenflaeche
//     */
//    public static int kostenBerechnen(int index) {
//        /*
//          Fügen Sie hier Ihren Code ein
//         */
//        Lebkuchenflaeche lebkuchenflaeche = flaechen.get(index);
//        Lebkuchen[][] lebkuchens = lebkuchenflaeche.getArray();
//        int time = 0;
//        for (int i = 0; i < lebkuchens.length; i++) {
//            for (int j = 0; j < lebkuchens[0].length; j++) {
//                if (lebkuchens[i][j] != null) {
//                    time += lebkuchens[i][j].getGlasur().getHerstellungszeit();
//                }
//            }
//        }
//        return time;
//    }
//
//    /**
//     * Wählt eine optimale Glasurvariante und berechnet deren Herstellungszeit
//     *
//     * @param index Index der zu bearbeitenden Lebkuchenflaeche in der Liste flaechen
//     * @return gesamte Herstellungszeit der Lebkuchenflaeche
//     */
//    public static int glasurOptimieren(int index) {
//        /*
//         * Fügen Sie hier Ihren Code ein
//         */
//        List<Lebkuchenglasur> kreuzmusterList = new ArrayList<>();
//        List<Lebkuchenglasur> sternchenmusterList = new ArrayList<>();
//        List<Lebkuchenglasur> strichmusterList = new ArrayList<>();
//        Lebkuchenflaeche lebkuchenflaeche = flaechen.get(index);
//        Lebkuchen[][] lebkuchens = lebkuchenflaeche.getArray();
//        for (int i = 0; i < lebkuchens.length; i++) {
//            for (int j = 0; j < lebkuchens[0].length; j++) {
//                if (lebkuchens[i][j] != null) {
//                    Lebkuchenglasur lebkuchenglasur = lebkuchens[i][j].getGlasur();
//                    if (lebkuchenglasur instanceof Kreuzmuster) {
//                        kreuzmusterList.add(lebkuchenglasur);
//                    } else if (lebkuchenglasur instanceof Sternchenmuster) {
//                        sternchenmusterList.add(lebkuchenglasur);
//                    } else if (lebkuchenglasur instanceof Strichmuster) {
//                        strichmusterList.add(lebkuchenglasur);
//                    }
//                }
//            }
//        }
//
//        int max = Math.max(kreuzmusterList.size(), Math.max(sternchenmusterList.size(), strichmusterList.size()));
//        int min = Math.min(kreuzmusterList.size(), Math.min(sternchenmusterList.size(), strichmusterList.size()));
//        int middle = kreuzmusterList.size() + sternchenmusterList.size() + strichmusterList.size() - min - max;
//
//        return max * 8 + middle * 14 + min * 25;
//
//    }
//
//    /**
//     * Gibt Metadaten zu den Lebkuchenflaechen sowie die Glasurmuster alle Lebkuchenflaechen aus
//     *
//     * @param dateiname              Name der Ausgabe-Datei
//     * @param gesamtAnzahlBausteine  berechnete Anzahl der Bausteine in allen Lebkuchenflaechen
//     * @param gesamtHerstellungszeit berechnete Herstellugnszeit der Bausteine in allen Lebkuchenflaechen
//     */
//    public static void speichereAusgabeInDatei(String dateiname, int gesamtAnzahlBausteine, int gesamtHerstellungszeit) {
//        try {
//            FileWriter myWriter = new FileWriter(dateiname);
//
//            myWriter.write(String.format("Anzahl Bausteine: %d%s", gesamtAnzahlBausteine, System.lineSeparator()));
//            myWriter.write(String.format("Gesamte Herstellungszeit: %d Minuten%s", gesamtHerstellungszeit, System.lineSeparator()));
//
//            for (Lebkuchenflaeche f : flaechen) {
//                myWriter.write(f.getPosition().toString());
//                myWriter.write(System.lineSeparator());
//                myWriter.write(f.flaecheZeichnen());
//            }
//
//            myWriter.close();
//        } catch (IOException e) {
//            System.out.println("An error occurred.");
//            e.printStackTrace();
//        }
//    }
//}
